/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Database;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
 *
 * @author Zen
 */
public class Column implements Serializable{
    private String name; //Tên cột
    private List<Object> data; //dữ liệu của cột
    private Class type; //loại cột Integer/String
    private boolean allowNull;

    public Column(String name, Class type, boolean  allowNull)
    {
        this.name = name;
        this.allowNull = allowNull;
        this.type = type;
        data = new ArrayList<Object>();
    }
    
    public String getName() 
    {
        return name;
    }

    public void setName(String name) 
    {
        this.name = name;
    }
 
    public List<Object> getData() 
    {
        return data;
    }

    public void setData(List<Object> data) 
    {
        this.data = data;
    }
    public boolean setData(int index, Object value) 
    {
        if(value == null)
        {    
            if(allowNull==true)
            {
                this.data.set(index, value);
                return true;
            }
            else
                return false;                
        }
        else
        {
            if(type.equals(Integer.class))
            {
                if(value == null)
                    this.data.set(index, value);
                else
                {
                    try
                    {
                        Integer.parseInt(value.toString());
                        this.data.set(index, value);
                    }catch (NumberFormatException nx) {
                        return false;
                    }
                }
            }
            else
                data.add(value);
            return true;
        }
    }

    public Class getType() 
    {
        return type;
    }

    public boolean setType(Class type) 
    {        
        for(int i=0;i<data.size();i++)
        {           
            if(data.get(i)!=null)
            {
                if(type==Integer.class)
                {
                    int value=-1;
                    try
                    {                
                        value = Integer.parseInt(data.get(i).toString());                
                    }catch (NumberFormatException nx) {
                        return false;
                    }
                    data.set(i,value);
                }
                else
                    data.set(i, data.get(i).toString());
            }
        }
        this.type = type;
        return true;
    }
    
    public boolean getAllowNull() 
    {
        return allowNull;
    }

    public void setAllowNull(boolean allowNull) 
    {
        this.allowNull = allowNull;
    }    
        
    //Thêm 1 giá trị vào cuối của cột
    
    protected boolean Insert(Object value)
    {
        if(type.equals(Integer.class))
        {
            int parseInt;
            try
            {
                parseInt = Integer.parseInt(value.toString());
            }catch (NumberFormatException nx) {
                return false;
            }
            data.add(parseInt);
        }
        else
            data.add(value);
        return true;
    }
    
    // Kiểm tra dữ liệu đã tồn tại trong cột chưa
    // Tồn tại trả về true
    // Ko tồn tại trả về false;
    protected boolean IsExist(Object value)
    {
        for(int i=0;i<getData().size();i++)
            if(getData().get(i).toString().equals(value.toString()))
                return true;
        return false;
    }        
    
    // xóa 1 dữ liệu tại vị trí index
    protected boolean RemoveData(int index)
    {
        if(index<0||index>=data.size())
            return false;
        data.remove(index);
        return true;
    }
    
    //Đặt dữ liệu tại vị trí index
    protected boolean SetData(int index, Object value)
    {
        if(index<data.size())
        {
            data.set(index, value);        
            return true;
        }
        return false;
    }    
    //lấy dữ liệu tại ví trí index
    protected Object GetData(int index)
    {
        if(index<0||index>=data.size())
            return null;
        return data.get(index);
    }
    
    //Tìm vị trí hàng có dữ liệu == value
    //Không tìm thấy trả về -1
    protected int getRowIndex(Object value)
    {
        for(int i=0;i<data.size();i++)
            if(data.get(i).equals(value))
                return i;
        return -1;
    }

}
